home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 October: Mac OS SDK / Dev.CD Oct 96 SDK / Dev.CD Oct 96 SDK1.toast / Development Kits (Disc 1) / Open Transport / Sample Code / DLPI / ATM PCI DLPI / Sources / ATMDebug.c next >
Encoding:
C/C++ Source or Header  |  1995-08-03  |  10.6 KB  |  322 lines  |  [TEXT/MPS ]

  1. /***********************************************************
  2.     File:        ATMDebug.c
  3.  
  4.     Contains:    ATM Streams Debugging Utilities
  5.     
  6.     Written by:    
  7.  
  8.     Copyright:    © 1994 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.     
  12.     To Do:
  13.  ***********************************************************/
  14.  
  15.  
  16. /***********************************************************
  17.   INCLUDES
  18.  ***********************************************************/
  19.  
  20. #include "ATMDebug.h"
  21.  
  22. #include <OpenTptDev.h>
  23. #include <mistream.h>
  24. #include <tihdr.h>
  25. #include <dlpi.h>
  26.  
  27. /***********************************************************
  28.   DEFINES
  29.  ***********************************************************/
  30.  
  31. #define TEXTSIZE 10
  32.  
  33. #define NULL 0
  34.  
  35. /***********************************************************
  36.   EXTERNS
  37.  ***********************************************************/
  38.  
  39. //extern char *sprintf();
  40.  
  41. /***********************************************************
  42.   STRUCTS AND TYPEDEFS
  43.  ***********************************************************/
  44.  
  45. typedef struct {
  46.         char    *name;
  47.         int     num;
  48. } msg_name_t;
  49.  
  50. /***********************************************************
  51.   GLOBALS
  52.  ***********************************************************/
  53.  
  54. /* Globals */
  55.     
  56. static msg_name_t stream_msgtab[] = {
  57.     { "M_DATA"        , 00       },    /* regular data */
  58.     { "M_PROTO"        , 01       },    /* protocol control */
  59.     { "M_BREAK"        , 010      },    /* line break */
  60.     { "M_PASSFP"    , 011      },    /* pass file pointer */
  61.     { "M_SIG"        , 013      },    /* generate process loopnal */
  62.     { "M_DELAY"        , 014      },    /* real-time xmit delay (1 param) */
  63.     { "M_CTL"        , 015      },    /* device-specific control message */
  64.     { "M_IOCTL"        , 016      },    /* ioctl; set/get params */
  65.     { "M_SETOPTS"    , 020      },    /* set various stream head options */
  66.     { "M_IOCACK"    , 0201     },    /* acknowledge ioctl */
  67.     { "M_IOCNAK"    , 0202     },    /* negative ioctl acknowledge */
  68.     { "M_PCPROTO"    , 0203     },    /* priority proto message */
  69.     { "M_PCSIG"        , 0204     },    /* generate process loopnal */
  70.     { "M_FLUSH"        , 0206     },    /* flush your queues */
  71.     { "M_STOP"        , 0207     },    /* stop transmission immediately */
  72.     { "M_START"        , 0210     },    /* restart transmission after stop */
  73.     { "M_HANGUP"     , 0211     },    /* line disconnect */
  74.     { "M_ERROR"        , 0212     },    /* fatal error used to set u.u_error */
  75.     { "M_STOPI"        , 0213     },    /* stop reception immediately */
  76.     { "M_STARTI"    , 0214     },    /* restart reception after stop */
  77.     { "M_UNHANGUP"    , 0215     },    /* line reconnect, looph */
  78.     {  NULL            , NULL     }
  79. };
  80.  
  81.  
  82. static msg_name_t tpi_msgtab[] = {
  83.     { "T_BIND_REQ",                T_BIND_REQ},
  84.     { "T_CONN_REQ",                T_CONN_REQ},        /* connection request */
  85.     { "T_CONN_RES",                T_CONN_RES},    /* respond to connection indication */
  86.     { "T_DATA_REQ",                T_DATA_REQ},
  87.     { "T_DISCON_REQ",            T_DISCON_REQ},
  88.     { "T_EXDATA_REQ",            T_EXDATA_REQ},
  89.     { "T_INFO_REQ",                T_INFO_REQ},
  90.     { "T_OPTMGMT_REQ",            T_OPTMGMT_REQ},
  91.     { "T_ORDREL_REQ",            T_ORDREL_REQ},
  92.     { "T_UNBIND_REQ",            T_UNBIND_REQ},
  93.     { "T_UNITDATA_REQ",            T_UNITDATA_REQ},
  94.     { "T_ADDR_REQ",                T_ADDR_REQ},        /* Get address request                */
  95.     { "T_UREQUEST_REQ",            T_UREQUEST_REQ},        /* UnitRequest (transaction) req    */
  96.     { "T_REQUEST_REQ",            T_REQUEST_REQ},        /* Request (CO transaction) req        */
  97.     { "T_UREPLY_REQ",            T_UREPLY_REQ},        /* UnitRequest (transaction) req    */
  98.     { "T_REPLY_REQ",            T_REPLY_REQ},        /* REPLY (CO transaction) req        */
  99. //    { "T_CANCELUREQ_REQ",        T_CANCELUREQ_REQ},        /* Cancel (transaction) UnitReq        */
  100. //    { "T_CANCELREQ_REQ",        T_CANCELREQ_REQ},        /* Cancel (CO transaction) req        */
  101.     { "T_CANCELREQUEST_REQ",    T_CANCELREQUEST_REQ},        /* Cancel outgoing request            */
  102.     { "T_CANCELREPLY_REQ",        T_CANCELREPLY_REQ},            /* Cancel incoming request            */
  103. //    { "T_FEEDBACK_REQ",            T_FEEDBACK_REQ},        /* used internally */
  104.     { "T_REGNAME_REQ",            T_REGNAME_REQ},        /* Request name registration    */
  105.     { "T_DELNAME_REQ",            T_DELNAME_REQ},        /* Request delete name registration */
  106.     { "T_LKUPNAME_REQ",            T_LKUPNAME_REQ},        /* Request name lookup          */
  107. //    { "T_CONFIRMNAME_REQ",        T_CONFIRMNAME_REQ},        /* Request name-address confirmation */
  108.     
  109.     /* Transport generated indications and acknowledgements */
  110.     { "T_BIND_ACK",                T_BIND_ACK},
  111.     { "T_CONN_CON",                T_CONN_CON},        /* connection confirmation */
  112.     { "T_CONN_IND",                T_CONN_IND},        /* incoming connection indication */
  113.     { "T_DATA_IND",                T_DATA_IND},
  114.     { "T_DISCON_IND",            T_DISCON_IND},
  115.     { "T_ERROR_ACK ",            T_ERROR_ACK},
  116.     { "T_EXDATA_IND",            T_EXDATA_IND},
  117.     { "T_INFO_ACK",                T_INFO_ACK},
  118.     { "T_OK_ACK",                T_OK_ACK},
  119.     { "T_OPTMGMT_ACK",            T_OPTMGMT_ACK},
  120.     { "T_ORDREL_IND",            T_ORDREL_IND},
  121.     { "T_UNITDATA_IND",            T_UNITDATA_IND},
  122.     { "T_UDERROR_IND",            T_UDERROR_IND},
  123.     { "T_ADDR_ACK",                T_ADDR_ACK},        /* Get address ack                    */
  124.     { "T_UREQUEST_IND",            T_UREQUEST_IND},        /* UnitRequest (transaction) ind    */
  125.     { "T_REQUEST_IND",            T_REQUEST_IND},        /* Request (CO transaction) ind     */
  126. //    { "T_UREQUEST_CON",            T_UREQUEST_CON},        /* UnitReq(transaction)response        */
  127. //    { "T_REQUEST_CON",            T_REQUEST_CON},        /* Request(CO transaction)response    */
  128.     { "T_UREPLY_ACK",            T_UREPLY_ACK},        /* UnitReq(transaction)response ack    */
  129.     { "T_REPLY_ACK",            T_REPLY_ACK},        /* Request(CO trans)response ack    */
  130.     { "T_UREPLY_IND",            T_UREPLY_IND},        /* Incoming unit reply                */
  131.     { "T_REPLY_IND",            T_REPLY_IND},        /* Incoming reply                    */
  132.     
  133. //    { "T_RESOLVE_REQ",            T_RESOLVE_REQ},
  134. //    { "T_RESOLVE_ACK",            T_RESOLVE_ACK},
  135.     { "T_RESOLVEADDR_REQ",        T_RESOLVEADDR_REQ},
  136.     { "T_RESOLVEADDR_ACK",        T_RESOLVEADDR_ACK},
  137.     
  138.     { "T_LKUPNAME_CON",            T_LKUPNAME_CON},        /* Results of name lookup       */
  139.     { "T_LKUPNAME_RES",            T_LKUPNAME_RES},        /* Partial results of name lookup       */
  140.     { "T_SEQUENCED_ACK",        T_SEQUENCED_ACK},        /* Sequenced version of OK or ERROR ACK */
  141.     {  NULL            , NULL     }
  142. };
  143.  
  144. static msg_name_t dlpi_msgtab[] = {
  145.     { "DL_INFO_REQ"        , 0x00    },
  146.     { "DL_INFO_ACK"        , 0x03    },
  147.     { "DL_ATTACH_REQ"        , 0x0b    },
  148.     { "DL_DETACH_REQ"        , 0x0c    }, 
  149.     { "DL_BIND_REQ"        , 0x01    },
  150.     { "DL_BIND_ACK"        , 0x04    },
  151.     { "DL_UNBIND_REQ"        , 0x02    }, 
  152.     { "DL_OK_ACK"        , 0x06    },
  153.     { "DL_ERROR_ACK"        , 0x05    },
  154.     { "DL_SUBS_BIND_REQ"    , 0x1b    }, 
  155.     { "DL_SUBS_BIND_ACK"    , 0x1c    },
  156.     { "DL_SUBS_UNBIND_REQ"    , 0x15    }, 
  157.     { "DL_ENABMULTI_REQ"    , 0x1d    }, 
  158.     { "DL_DISABMULTI_REQ"    , 0x1e    }, 
  159.     { "DL_PROMISCON_REQ"    , 0x1f    },
  160.     { "DL_PROMISCOFF_REQ"    , 0x20    },
  161.     { "DL_UNITDATA_REQ"        , 0x07    },
  162.     { "DL_UNITDATA_IND"        , 0x08    },
  163.     { "DL_UDERROR_IND"        , 0x09    },
  164.     { "DL_UDQOS_REQ", 0x0a}, 
  165.     { "DL_CONNECT_REQ", 0x0d}, 
  166.     { "DL_CONNECT_IND", 0x0e}, 
  167.     { "DL_CONNECT_RES", 0x0f},
  168.     { "DL_CONNECT_CON", 0x10},
  169.     { "DL_TOKEN_REQ", 0x11},
  170.     { "DL_TOKEN_ACK", 0x12},
  171.     { "DL_DISCONNECT_REQ", 0x13    }, 
  172.     { "DL_DISCONNECT_IND", 0x14    },
  173.     { "DL_RESET_REQ", 0x17},
  174.     { "DL_RESET_IND", 0x18},
  175.     { "DL_RESET_RES", 0x19}, 
  176.     { "DL_RESET_CON", 0x1a}, 
  177.     { "DL_DATA_REQ", 0x100}, /* remove */
  178.     { "DL_DATA_IND", 0x101}, /* remove */
  179.     { "DL_DATA_ACK_REQ", 0x21},
  180.     { "DL_DATA_ACK_IND", 0x22}, 
  181.     { "DL_DATA_ACK_STATUS_IND", 0x23    }, 
  182.     { "DL_REPLY_REQ", 0x24}, 
  183.     { "DL_REPLY_IND", 0x25}, 
  184.     { "DL_REPLY_STATUS_IND", 0x26    },
  185.     { "DL_REPLY_UPDATE_REQ", 0x27    }, 
  186.     { "DL_REPLY_UPDATE_STATUS_IND ", 0x28 }, 
  187.     { "DL_XID_REQ",  0x29     }, 
  188.     { "DL_XID_IND", 0x2a}, 
  189.     { "DL_XID_RES", 0x2b}, 
  190.     { "DL_XID_CON", 0x2c}, 
  191.     { "DL_TEST_REQ", 0x2d},
  192.     { "DL_TEST_IND", 0x2e},
  193.     { "DL_TEST_RES", 0x2f},
  194.     { "DL_TEST_CON", 0x30},
  195.     { "DL_PHYS_ADDR_REQ", 0x31}, 
  196.     { "DL_PHYS_ADDR_ACK", 0x32}, 
  197.     { "DL_SET_PHYS_ADDR_REQ", 0x33    },
  198.     { "DL_GET_STATISTICS_REQ", 0x34    },
  199.     { "DL_GET_STATISTICS_ACK", 0x35    },
  200.     { "DL_UNATTACHED", 0x04},
  201.     { "DL_ATTACH_PENDING", 0x05    },
  202.     { "DL_DETACH_PENDING", 0x06    },
  203.     { "DL_UNBOUND", 0x00}, 
  204.     { "DL_BIND_PENDING", 0x01}, 
  205.     { "DL_UNBIND_PENDING", 0x02    }, 
  206.     { "DL_IDLE", 0x03    },
  207.     { "DL_UDQOS_PENDING", 0x07},
  208.     { "DL_OUTCON_PENDING", 0x08    }, 
  209.     { "DL_INCON_PENDING", 0x09}, 
  210.     { "DL_CONN_RES_PENDING", 0x0a    }, 
  211.     { "DL_DATAXFER", 0x0b}, 
  212.     { "DL_USER_RESET_PENDING", 0x0c    }, 
  213.     { "DL_PROV_RESET_PENDING", 0x0d    }, 
  214.     { "DL_RESET_RES_PENDING", 0x0e    }, 
  215.     { "DL_DISCON8_PENDING", 0x0f    }, 
  216.     { "DL_DISCON9_PENDING", 0x10    }, 
  217.     { "DL_DISCON11_PENDING", 0x11    }, 
  218.     { "DL_DISCON12_PENDING", 0x12    }, 
  219.     { "DL_DISCON13_PENDING", 0x13    }, 
  220.     { "DL_SUBS_BIND_PND", 0x14}, 
  221.     { "DL_SUBS_UNBIND_PND", 0x15    }, 
  222.     {  NULL  , NULL }
  223. };
  224.  
  225. char* stream_msg_type(mblk_t *mp);
  226. char* tpi_msg_type(mblk_t *mp);
  227. char *dlpi_msg_type(mblk_t *mp);
  228.  
  229. void dump_dlpi_msg(mblk_t* mp);
  230. void dump_tpi_msg(mblk_t* mp);
  231.  
  232. char* stream_msg_type(mblk_t *mp)
  233. {
  234.     static char err_msg[64];
  235.     msg_name_t *msg;
  236.  
  237.     for (msg = &stream_msgtab[0]; msg->name != NULL; msg++)
  238.         if (mp->b_datap->db_type == msg->num)
  239.             return(msg->name);
  240.  
  241.     return((char*) sprintf(err_msg, "message num %d not defined",
  242.                                     mp->b_datap->db_type));
  243. }
  244.  
  245. char* tpi_msg_type(mblk_t *mp)
  246. {
  247.     static char err_msg[64];
  248.     msg_name_t *msg;
  249.  
  250.     if ((mp->b_datap->db_type != M_PROTO) &&
  251.         (mp->b_datap->db_type != M_PCPROTO))
  252.         return(" "); /* not a TPI message */
  253.  
  254.     for (msg = &tpi_msgtab[0]; msg->name != NULL; msg++) 
  255.         if (((union T_primitives *)mp->b_rptr)->type == msg->num)
  256.             return(msg->name);
  257.  
  258.     return((char*) sprintf(err_msg, "TPI msg num %d not defined",
  259.                         ((union T_primitives *)mp->b_rptr)->type));
  260. }
  261.  
  262. char *dlpi_msg_type(mblk_t *mp)
  263. {
  264.     static char err_msg[64];
  265.     msg_name_t *msg;
  266.  
  267.     if ((mp->b_datap->db_type != M_PROTO) &&
  268.         (mp->b_datap->db_type != M_PCPROTO))
  269.         return(" "); /* not a DLPI message */
  270.  
  271.     for (msg = &dlpi_msgtab[0]; msg->name != NULL; msg++) 
  272.         if (((union DL_primitives *)mp->b_rptr)->dl_primitive == msg->num)
  273.             return(msg->name);
  274.  
  275.     return((char*) sprintf(err_msg, "DLPI msg num %d not defined",
  276.                         ((union DL_primitives *)mp->b_rptr)->dl_primitive));
  277. }
  278.  
  279. void dump_dlpi_msg(mblk_t* mp)
  280. {
  281.     struct datab *db;
  282.     unsigned char   *cp;
  283. //    int    total
  284.     int len;
  285. //    int    i;
  286.     char tempstr[255];
  287.     
  288.     for ( ; mp; mp = mp->b_cont) {
  289.  
  290.         len = mp->b_wptr - mp->b_rptr;
  291.         cp = mp->b_rptr;
  292.         db = mp->b_datap;
  293.  
  294.         sprintf(tempstr, "%s: (%s) size=%ld, len=%ld, base=0x%lx, rptr=0x%lx, wptr=0x%lx",
  295.         stream_msg_type(mp), dlpi_msg_type(mp),
  296.         db->db_lim - db->db_base, len, db->db_base, mp->b_rptr, mp->b_wptr);
  297.         debugstr(tempstr);
  298.     }
  299. }
  300.  
  301. void dump_tpi_msg(mblk_t* mp)
  302. {
  303.     struct datab *db;
  304.     unsigned char   *cp;
  305. //    int    total
  306.     int len;
  307. //    int    i;
  308.     char tempstr[255];
  309.     
  310.     for ( ; mp; mp = mp->b_cont) {
  311.  
  312.         len = mp->b_wptr - mp->b_rptr;
  313.         cp = mp->b_rptr;
  314.         db = mp->b_datap;
  315.  
  316.         sprintf(tempstr, "%s: (%s) size=%ld, len=%ld, base=0x%lx, rptr=0x%lx, wptr=0x%lx",
  317.         stream_msg_type(mp), tpi_msg_type(mp),
  318.         db->db_lim - db->db_base, len, db->db_base, mp->b_rptr, mp->b_wptr);
  319.         debugstr(tempstr);
  320.     }
  321. }
  322.